package site.ruolin.Util;

import java.math.BigInteger;
import java.security.SecureRandom;

/**
 * 数学工具类，封装了一些数学方法（最大公约数的获取、最小公倍数的获取、大素数生成、L函数）
 * @author 邱锋 & ruolin on 2025/09/11
 */
public class MathUtil {
    /**
     * 获取两个数的最大公约数
     * @author  邱锋
     * @param a 参数一
     * @param b 参数二
     * @return 最大公约数
     */
    public static BigInteger gcd(BigInteger a, BigInteger b){
        if(b.equals(BigInteger.ZERO)){
            return a;
        }
        return gcd(b, a.mod(b));
    }

    /**
     * 获取两个数的最小公倍数
     * @author  邱锋
     * @param a 参数一
     * @param b 参数二
     * @return 最小公倍数
     */
    public static BigInteger lcm(BigInteger a, BigInteger b) {
        return a.multiply(b).divide(gcd(a, b));
    }

    /**
     * 随机生成一个素数
     * @author  邱锋
     * @param bitLength 素数Bit长度
     * @return 一个素数
     * 基于AI生成,可以生成一个大概率是素数的大整数（基于 Miller-Rabin 素性测试）
     */
    public static BigInteger GeneratorPrime(Integer bitLength){
        // 强随机数生成器
        SecureRandom secureRandom = new SecureRandom();

        // 生成一个 512 位的可能素数
        return BigInteger.probablePrime(bitLength, secureRandom);
    }

    /**
     * L函数: L(x) = (x-1)/n
     * @author ruolin
     * @param x 输入值
     * @param n 模数
     * @return 计算结果
     */
    public static BigInteger L(BigInteger x, BigInteger n){
        return x.subtract(BigInteger.ONE).divide(n);
    }
}
